/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

/**
 *
 * @author marcos
 */
public class Dao<T> {
    private EntityManager em =
            Persistence.createEntityManagerFactory("UP").createEntityManager();
    private Class classe;

    public Dao(Class classe) {
        this.classe = classe;
    }

    public void insert(T entidade) {
        em.getTransaction().begin();
        em.persist(entidade);
        em.getTransaction().commit();
    }

    public void update(T entidade) {
        em.getTransaction().begin();
        em.merge(entidade);
        em.getTransaction().commit();
    }

    public void remove(int id) {
        T entidade = get(id);
        if (entidade == null) {
            return;
        }
        em.getTransaction().begin();
        em.remove(entidade);
        em.getTransaction().commit();
    }

    public T get(int id) {
        return (T)em.find(classe, id);
    }
    public  List<T> getEmailSenha(String email,String senha){
        return   em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.email = '"+email+"' AND "+ "e.senha = '"+senha+"'").getResultList();
    }
    public List<T> list() {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e").getResultList();
    }

    public List query(String jpql) {
        System.out.println("Dao.query: "+jpql);
        return em.createQuery(jpql).getResultList();
    }

    // pesquisas especificas
    public List<T> listByNome(String nome) {
        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%'").getResultList();
    }
//
//    public List<T> listByNomeAndRg(String nome, String rg) {
//        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.nome LIKE '%"+nome+"%' AND "+
//                "e.rg LIKE '%"+rg+"%'").getResultList();
//    }
//
//    public List<T> listBySaldo(Double saldo) {
//        return em.createQuery("SELECT e FROM "+classe.getSimpleName()+" e WHERE e.saldo >= "+saldo).getResultList();
//    }
}
